<?php

namespace maotool\object;

use function PHPUnit\Framework\isNull;

class ObjectUtil
{

    /**
     * 比较两个对象是否相等。<br>
     * 相同的条件有两个，满足其一即可：<br>
     * @param $obj1 $ 对象1
     * @param $obj2 $ 对象2
     * @return bool 是否相等
     */
    public static function equals($obj1, $obj2)
    {
        return $obj1 === $obj2;
    }

    /**
     * 检查对象是否为null<br>
     * @param $obj $ 对象
     * @return bool 是否为null
     */
    public static function isNull($obj)
    {
        return is_null($obj);
    }

    /**
     * 检查对象是否不为null<br>
     * @param $obj $ 对象
     * @return bool 是否为null
     */
    public static function isNotNull($obj)
    {
        return !is_null($obj);
    }

    /**
     * 如果被检查对象为 {@code null}， 返回默认值（由 defaultValueSupplier 提供）；否则直接返回
     * @param $obj $ 对象
     * @param $default $ 默认值
     * @return mixed 对象
     */
    public static function defaultIfNull(&$obj, $default)
    {
        if (self::isNull($obj)) {
            $obj = $default;
        }
        return $obj;
    }

    /**
     * 判断指定对象是否为空，支持：
     * @param $obj $ 对象
     * @return bool 是否为empty
     */
    public static function isEmpty($obj)
    {
        return isset($obj);
    }

    /**
     * 判断指定对象是否为非空，支持：
     * @param $obj $ 对象
     * @return bool 是否为empty
     */
    public static function isNotEmpty($obj)
    {
        return !self::isEmpty($obj);
    }

    /**
     * 如果给定对象为{@code null}或者""返回默认值, 否则返回自定义handle处理后的返回值
     * @param $obj $ 对象
     * @param $default $ 默认值
     * @return mixed 对象
     */
    public static function defaultIfEmpty($obj, $default)
    {
        if (self::isEmpty($obj)) {
            $obj = $default;
        }
        return $obj;
    }

    /**
     * 克隆对象
     * @return mixed
     */
    public static function cloneObject($obj)
    {
        $str = self::serializeObject($obj);
        return self::unSerializeObject($str);
    }

    /**
     * 序列号对象
     * @return string
     */
    public static function serializeObject($obj)
    {
        return serialize($obj);
    }

    /**
     * 反序列号对象
     * @return mixed
     */
    public static function unSerializeObject($obj)
    {
        return unserialize($obj);
    }

    /**
     * 对象类型
     * @return string
     */
    public static function typeOf($obj){
        return gettype($obj);
    }

    /**
     * 对象转数组
     * @return string
     */
    public static function toArray($obj){
        return json_decode(json_encode($obj), true);
    }

}